package utils

import (
	"bytes"
	"crypto/rand"
	"encoding/gob"
	"encoding/hex"
	"regexp"
	"strconv"
	"strings"
	"unicode/utf8"
)

// GobEncode 编码
func GobEncode(res interface{}) ([]byte, error) {
	var result bytes.Buffer
	encoder := gob.NewEncoder(&result)
	err := encoder.Encode(res)
	return result.Bytes(), err
}

// GobDecode 解码
func GobDecode(res []byte, result interface{}) error {
	decoder := gob.NewDecoder(bytes.NewReader(res))
	err := decoder.Decode(result)
	return err
}

// Trim 去除前后空格
func Trim(str string) string {
	return strings.TrimSpace(str)
}

// Split 分割数组
func Split(str string, sep string) []string {
	return strings.Split(str, sep)
}

// Len 计算字符串中的中文字符数量
func Len(s string) int {
	count := 0
	for i := 0; i < len(s); {
		_, runeSize := utf8.DecodeRuneInString(s[i:])
		i += runeSize
		count++
		//unicode.Is(unicode.Han, runeValue) // 可以判断是否时汉字
	}
	return count
}

// GenerateRandomKey 生成指定位数的随机密钥
func GenerateRandomKey(length int) (string, error) {
	// 计算需要生成的字节数
	bytesNeeded := length / 2
	if length%2 != 0 {
		bytesNeeded++
	}

	// 生成随机字节
	randomBytes := make([]byte, bytesNeeded)
	_, err := rand.Read(randomBytes)
	if err != nil {
		return "", err
	}

	// 转换为十六进制字符串
	hexStr := hex.EncodeToString(randomBytes)

	// 截取所需长度
	if len(hexStr) > length {
		hexStr = hexStr[:length]
	}

	return hexStr, nil
}

// HidePhone 处理手机号，将中间四位替换为星号
// 支持纯数字手机号（如13800138000）或带分隔符的格式（如138-0013-8000）
func HidePhone(phone string) string {
	// 正则表达式：匹配11位数字的手机号（忽略分隔符）
	re := regexp.MustCompile(`(\d{3}).*(\d{4})`)

	// 替换中间部分为****
	return re.ReplaceAllString(phone, "$1****$2")
}

func Str2Int64(value string) int64 {
	result, _ := strconv.ParseInt(value, 10, 64)
	return result
}

func Str2Int(value string) int {
	result := Str2Int64(value)
	return int(result)
}

func Str2Bool(value string) bool {
	result, _ := strconv.ParseBool(value)
	return result
}

// AddZero 十位补0
func AddZero(val int) string {
	num := strconv.Itoa(val)
	if val < 10 {
		num = "0" + num
	}
	return num
}
